package com.centriole.service.workflow.controller.ex;

import com.centriole.common.exception.PaasException;
import com.centriole.common.utils.CommonUtil;
import com.centriole.common.utils.PaasResult;
import com.centriole.service.workflow.common.Constant;
import com.centriole.service.workflow.common.QueryVo;
import com.centriole.service.workflow.dao.ProInstanceMapper;
import com.centriole.service.workflow.entity.ProInstance;
import com.centriole.service.workflow.service.ActManagerService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 *  功   能：针对paas平台的service层
 *  创建人：陈默晗
 *  时   间：2018年4月25日上午10:40:18
 */
@Service
public class ExService {

    @Autowired
    ActManagerService actManagerService;

    @Autowired
    ProInstanceMapper proInstanceMapper;




    /**
     * 根据 用户id，流程状态，流程定义key 查询指定的流程实例
     * @param vo 查询对象
     * @return   List<ProInstance>
     */
    public List<ProInstance> listInstanceByCondition(QueryVo vo){

        //如果 deadTime不为空，那就 只会查询 进行中流程实例
        if(vo.getDeadTime() != null) vo.setState("1");


        if(vo == null) return new ArrayList<>();        //Vo引用为空，就直接返回空集合
        List<HistoricProcessInstance> runInstances = actManagerService.findApplyInstaces(vo.getUserId(), vo.convertState(), vo.getProcessDefinitionKey());
        List<ProInstance> resultList = runInstances.stream()
                .map(actInstance -> {
                    String instanceId = actInstance.getSuperProcessInstanceId();
                    Date finishTime = proInstanceMapper.selectEndTime(instanceId);
                    ProInstance p = proInstanceMapper.selectByInstanceId(instanceId);
                    if(p == null ) return null;
                    p.setFinishTime(finishTime);    //设置 流程实例 结束时间，"pro_instance"中并没有记录 流程实例的结束时间，从activiti的内部表去查到
                    p.convertVoState();
                    return p;
                })
                .filter(e -> ExUtils.isFiltered(vo, e))
                .collect(Collectors.toList());
        return resultList;
    }

    /**
     * 查找今天新增的流程实例
     * @return
     */
    public List<ProInstance> listTodayInstaces(){
        return proInstanceMapper.selectTodayInstances();
    }

    /**
     * 查询长时间未结束的流程实例
     * @param vo
     * @return
     */
    public List<ProInstance> listDeadProInstances(QueryVo vo){
        //如果调用了这个方法，但没有传入 指定的时间参数，将默认设定 查询30天都还没有结束的流程实例
        if(vo.getDeadTime() == null ) vo.setDeadTime(Constant.DEAFULT_DEAD_DAY);
        return proInstanceMapper.selectDeadInstaces(vo) ;
    }

    public String testError(){
        throw new PaasException("RuntimeException");
    }
}
